"""提示词引擎"""

from typing import List, Dict, Any, Optional
from pathlib import Path
from datetime import datetime

from ..models.file_info import FileInfo
from ..models.directory_rule import AnalysisContext
from ..models.config import UserPreferences


class PromptEngine:
    """提示词工程管理"""
    
    def __init__(self, user_preferences: Optional[UserPreferences] = None):
        self.user_preferences = user_preferences or UserPreferences()
        self._load_templates()
    
    def _load_templates(self) -> None:
        """加载提示词模板"""
        self.system_template = """你是一个专业的文件归档助手，专门帮助用户智能整理和分类文件。

你的任务是根据文件名、用户描述和现有目录结构，为每个文件生成最佳的归档路径建议。

## 分析原则：
1. 优先使用现有目录结构，避免创建不必要的新目录
2. 充分理解中文文件名的含义和上下文
3. 考虑用户的个人习惯和偏好设置
4. 生成2-3级的合理目录结构
5. 为每个建议提供清晰的推理过程

## 输出格式：
请严格按照以下JSON格式返回结果（支持批量文件）：
```json
[
  {
    "category": "主分类名称",
    "subcategory": "子分类名称（可选）",
    "suggested_path": "完整的建议路径",
    "confidence": 0.85,
    "keywords": ["关键词1", "关键词2"],
    "date_based": false,
    "reasoning": "详细的推理过程",
    "alternative_paths": ["备选路径1", "备选路径2"]
  }
]
```

请确保：
- confidence值在0.0-1.0之间
- suggested_path是完整的相对路径
- reasoning解释选择该路径的原因
- 考虑中文语境和用户习惯"""

        self.few_shot_examples = [
            {
                "input": {
                    "files": ["Python数据分析教程.pdf"],
                    "existing_structure": ["学习资料/", "工作文档/", "个人文件/"],
                    "user_description": "",
                    "preferences": "学习资料按技术栈分类"
                },
                "output": {
                    "category": "学习资料",
                    "subcategory": "编程",
                    "suggested_path": "学习资料/编程/Python/数据分析/Python数据分析教程.pdf",
                    "confidence": 0.92,
                    "keywords": ["Python", "数据分析", "教程"],
                    "date_based": False,
                    "reasoning": "文件名明确包含'Python'和'数据分析'关键词，属于编程学习资料，应归档到相应的技术栈分类下",
                    "alternative_paths": [
                        "学习资料/编程/Python/Python数据分析教程.pdf",
                        "学习资料/数据科学/Python数据分析教程.pdf"
                    ]
                }
            },
            {
                "input": {
                    "files": ["会议纪要-2024年项目启动.docx"],
                    "existing_structure": ["工作文档/项目管理/", "工作文档/会议记录/"],
                    "user_description": "公司新项目的启动会议记录",
                    "preferences": "工作文件按项目分组，包含时间信息"
                },
                "output": {
                    "category": "工作文档",
                    "subcategory": "会议记录",
                    "suggested_path": "工作文档/会议记录/项目启动/2024年/会议纪要-2024年项目启动.docx",
                    "confidence": 0.95,
                    "keywords": ["会议纪要", "项目启动", "2024年"],
                    "date_based": True,
                    "reasoning": "用户明确说明是项目启动会议记录，结合文件名中的时间信息，应归档到会议记录分类下的项目启动子目录",
                    "alternative_paths": [
                        "工作文档/项目管理/启动文档/会议纪要-2024年项目启动.docx"
                    ]
                }
            }
        ]
    
    def build_analysis_prompt(self, files: List[FileInfo], 
                             context: AnalysisContext) -> str:
        """构建分析提示词"""
        # 文件信息
        file_list = self._format_files(files)
        
        # 现有目录结构
        directory_structure = self._format_directory_structure(context.existing_structure)
        
        # 用户描述
        user_description = context.user_description or "无"
        
        # 用户偏好
        preferences = self._format_user_preferences(context.user_preferences)
        
        # 构建完整提示词
        prompt = f"""{self.system_template}

## 当前任务信息：

### 待分析文件：
{file_list}

### 现有目录结构：
{directory_structure}

### 用户描述：
{user_description}

### 用户偏好设置：
{preferences}

### 参考示例：
{self._format_examples()}

现在请分析上述文件并返回JSON格式的归档建议："""

        return prompt
    
    def _format_files(self, files: List[FileInfo]) -> str:
        """格式化文件列表"""
        if not files:
            return "无文件"
        
        file_info = []
        for i, file in enumerate(files, 1):
            info = f"{i}. 文件名: {file.name}"
            if file.extension:
                info += f"\n   扩展名: {file.extension}"
            if file.size:
                size_mb = file.size / (1024 * 1024)
                info += f"\n   大小: {size_mb:.2f}MB"
            if file.keywords:
                info += f"\n   关键词: {', '.join(file.keywords)}"
            
            file_info.append(info)
        
        return "\n\n".join(file_info)
    
    def _format_directory_structure(self, structure: List[str]) -> str:
        """格式化目录结构"""
        if not structure:
            return "目录结构为空，需要创建新的分类"
        
        # 按层级排序和格式化
        sorted_dirs = sorted(structure)
        formatted = []
        
        for directory in sorted_dirs[:20]:  # 限制显示数量
            formatted.append(f"- {directory}")
        
        if len(structure) > 20:
            formatted.append(f"... (还有{len(structure) - 20}个目录)")
        
        return "\n".join(formatted)
    
    def _format_user_preferences(self, preferences: Dict[str, Any]) -> str:
        """格式化用户偏好"""
        if not preferences:
            return "无特殊偏好"
        
        formatted = []
        
        # 日期格式偏好
        if 'date_format' in preferences:
            formatted.append(f"日期格式: {preferences['date_format']}")
        
        # 分类优先级
        if 'classification_priority' in preferences:
            priority_map = {
                'content': '内容优先',
                'time': '时间优先', 
                'type': '类型优先'
            }
            priority = priority_map.get(preferences['classification_priority'], preferences['classification_priority'])
            formatted.append(f"分类优先级: {priority}")
        
        # 自定义规则
        if 'custom_prompts' in preferences:
            prompts = preferences['custom_prompts']
            if prompts:
                formatted.append("自定义规则:")
                for prompt in prompts[:3]:  # 最多显示3个
                    formatted.append(f"  - {prompt}")
        
        # 路径偏好
        if 'path_preferences' in preferences:
            path_prefs = preferences['path_preferences']
            formatted.append("路径偏好:")
            for key, value in path_prefs.items():
                formatted.append(f"  - {key}: {value}")
        
        return "\n".join(formatted) if formatted else "使用默认偏好"
    
    def _format_examples(self) -> str:
        """格式化示例"""
        examples = []
        
        for i, example in enumerate(self.few_shot_examples[:2], 1):  # 最多2个示例
            input_data = example['input']
            output_data = example['output']
            
            example_text = f"""
示例 {i}:
输入：
- 文件: {', '.join(input_data['files'])}
- 现有目录: {', '.join(input_data['existing_structure'])}
- 用户描述: {input_data['user_description'] or '无'}

输出：
{json.dumps(output_data, ensure_ascii=False, indent=2)}
"""
            examples.append(example_text)
        
        return "\n".join(examples)
    
    def build_batch_prompt(self, files: List[FileInfo], 
                          context: AnalysisContext) -> str:
        """构建批量分析提示词"""
        # 对于批量文件，增加批量处理说明
        base_prompt = self.build_analysis_prompt(files, context)
        
        batch_instruction = f"""
## 批量处理说明：
- 当前需要处理 {len(files)} 个文件
- 请为每个文件生成单独的归档建议
- 考虑文件之间的关联性（如果有用户描述提到）
- 返回包含 {len(files)} 个元素的JSON数组
- 确保每个文件都有对应的归档建议

"""
        
        return base_prompt.replace("现在请分析上述文件", batch_instruction + "现在请分析上述文件")
    
    def build_refinement_prompt(self, original_rule: Dict[str, Any], 
                               user_feedback: str) -> str:
        """构建优化提示词"""
        return f"""基于用户反馈，请优化以下归档建议：

原始建议：
{json.dumps(original_rule, ensure_ascii=False, indent=2)}

用户反馈：
{user_feedback}

请生成改进的归档建议，保持JSON格式不变："""